/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package gradius.Elementos.Naves;

import gradius.InterfaceGrafica.TelaGrafica;
import gradius.Elementos.Tiros.Tiro;
import gradius.Elementos.Tiros.TiroFactory;
import java.awt.Image;
import java.util.ArrayList;

/** Classe que define os atributos e métodos da nave Vicviper
 * @author Eduardo
 */
public class Vicviper extends NaveAtiradora
{

    private ArrayList<Multiple> multiplos;
    private int nroUpgrades;
    private int nroSpeedUps;
    private int score;

    /** Construtor da classe Vicviper
     * @param tela - Painel de desenho do jogo
     * @param imagens - Vetor onde as imagens de um determinado elemento são armazenadas
     * @param coordX - Coordenada do eixo horizontal
     * @param coordY - Coordenada do eixo vertical
     * @param tamX - Largura em pixels do elemento no eixo horizontal
     * @param tamY - Largura em pixels do elemento no eixo vertical
     */
    public Vicviper(TelaGrafica tela, Image[] imagens, int coordX, int coordY, int tamX, int tamY)
    {
        super(tela,imagens, coordX, coordY, tamX, tamY);
        this.setVidaNave(10);
        multiplos = new ArrayList<Multiple>();
        multiplos.clear();
        nroUpgrades = 0;
        score=0;
    }

    /** Método que coloca os tiros da nave Vicviper num arrayList
     * @param tela - Painel de desenho do jogo
     * @param tiros - Tiros da nave
     */
    @Override
    public void atira(TelaGrafica tela, ArrayList<Tiro> tiros)
    {
        if (this.getTiro1Ready() == 1)
        {
            tiros.add(TiroFactory.getInstance(tela, this.getTipoTiro1(), this.getElementoCoordenada().getCoordX(), this.getElementoCoordenada().getCoordY()+20));
        }
        if (this.getTipoTiro2()!=null)
        {
            if (this.getTiro2Ready() == 1)
            {
                tiros.add(TiroFactory.getInstance(tela, this.getTipoTiro2(), this.getElementoCoordenada().getCoordX(), this.getElementoCoordenada().getCoordY()+20));
            }
        }
    }

    /** Método que adiciona o Multiplo a nave
     *
     * @param tela - Painel de desenho do jogo
     */
    public void adicionaMultiplo(TelaGrafica tela)
    {
        if (this.multiplos.isEmpty())
        {
            this.multiplos.add(MultipleFactory.getInstance(tela, this.getElementoCoordenada().getCoordX(), this.getElementoCoordenada().getCoordY() + this.getElementoTamanho().getCoordY() + 20, this));
        }
        else
        {
            if (this.multiplos.size() == 1)
            {
                this.multiplos.add(MultipleFactory.getInstance(tela, this.getElementoCoordenada().getCoordX(), this.getElementoCoordenada().getCoordY()- 40, this));
            }
        }
    }

    /** Metodo getter que retorna um ArrayList de multiplos que a nava possui
     *
     * @return ArrayList<Multiplo> - Retorna o ArrayList de Multiplos que a nave possui
     */
    public ArrayList<Multiple> getMultiplos()
    {
        return this.multiplos;
    }

    /** Método setter que seta se multiplo está pronto para disparar o tiro1
     *
     * @param ready - Parâmetro que determina se o multiplo está pronto para disparar o tiro1
     */
    public void setMultiplosTiro1Ready(int ready)
    {
        for (int i = 0; i<this.multiplos.size(); i++)
        {
            multiplos.get(i).setTiro1Ready(ready);
        }
    }

    /** Método setter que seta se multiplo está pronto para disparar o tiro2
     *
     * @param ready - Parâmetro que determina se o multiplo está pronto para disparar o tiro2
     */
    public void setMultiplosTiro2Ready(int ready)
    {
        for (int i = 0; i<this.multiplos.size(); i++)
        {
            multiplos.get(i).setTiro2Ready(ready);
        }
    }

    /** Método que adiciona conta upgrades da nave
     *
     */
    public void addUpgrade()
    {
        if (this.nroUpgrades==5)
        {
            this.nroUpgrades = 1;
        }
        else
        {
            this.nroUpgrades++;
        }
    }

    /** Método getter que retorna o numero de upgrades que a nave possui
     *
     * @return int - Numero de upgrades que a nave possui
     */
    public int getNroUpgrade()
    {
        int i = this.nroUpgrades;
        return i;
    }

    /** Método getter que retorna o numero de SpeedUps que a nave possui
     *
     * @return int - Numero de speedups que a nave possui
     */
    public int getNroSpeedUps()
    {
        int i = this.nroSpeedUps;
        return i;
    }

    /** método que incrementa o numero de SpeedUps
     *
     */
    public void incrementaSpeedUps()
    {
        this.nroSpeedUps++;
    }

    /** Método que faz os upgrades nos multiplos de acordo com os feitos na nave
     *
     */
    public void fazerUpgrade()
    {
        for(int i = 0; i<this.multiplos.size(); i++)
        {
            multiplos.get(i).update();
        }
        this.limpaUpgrades();
    }

    /** Método que zera os upgrads após ter ocrrido upgrade de alguma opção
     *
     */
    private void limpaUpgrades()
    {
        this.nroUpgrades=0;
    }

    /** Método getter que retorna a pontuação do jogador
     *
     * @return int - Quantidade de pontos feitos
     */
    public int getScore()
    {
        int i = score;
        return i;
    }

    /** Método que incrementa a pontuação do jogador
     *
     * @param score - Pontuação feita
     */
    public void incrementaScore(int score)
    {
        this.score += score;
    }

    /** Método que executa as ações da nave
     *
     * @param tela - Painel de desenho do jogo
     * @param bufferTeclado - Vetor que contém os comandos do teclado que o jogador executou
     * @param tirosAliados - ArrayList de tiros da nave
     */
    public void executaAcao(TelaGrafica tela, int[] bufferTeclado, ArrayList<Tiro> tirosAliados)
    {
        if(bufferTeclado[0] == 1)
        {
            for (int i = 0; i < this.multiplos.size(); i++)
            {
                if (i == 1)
                {
                    if (multiplos.get(i).getElementoCoordenada().getCoordY() - (this.getElementoCoordenada().getCoordY() + this.getElementoTamanho().getCoordY()) >= 10 + this.getElementoTamanho().getCoordY())
                    {
                        if (multiplos.get(i).getElementoCoordenada().getCoordY() >= 20)
                        {
                            multiplos.get(i).incrementaElementoCoordenada(0, -20);
                        }
                    }
                }
                else
                {
                    if (multiplos.get(i).getElementoCoordenada().getCoordY() - (this.getElementoCoordenada().getCoordY() + this.getElementoTamanho().getCoordY()) >= -20 + this.getElementoTamanho().getCoordY())
                    {
                        if (multiplos.get(i).getElementoCoordenada().getCoordY() >= 20)
                        {
                            multiplos.get(i).incrementaElementoCoordenada(0, -20);
                        }
                    }
                }
            }
            if (this.getElementoCoordenada().getCoordY() >= 20)
            {
                this.incrementaElementoCoordenada(0, -20);
            }
        }
        if(bufferTeclado[3] == 1)
        {
            for (int i = 0; i < this.multiplos.size(); i++)
            {
                if (multiplos.get(i).getElementoCoordenada().getCoordX() + multiplos.get(i).getElementoTamanho().getCoordX() <= tela.getBounds().getWidth())
                {
                    if (i ==1)
                    {
                        if (multiplos.get(i).getElementoCoordenada().getCoordX() - this.getElementoCoordenada().getCoordX() <= -100)
                        {
                            multiplos.get(i).incrementaElementoCoordenada(20, 0);
                        }
                        if (multiplos.get(i).getElementoCoordenada().getCoordY() > this.getElementoCoordenada().getCoordY())
                        {
                            multiplos.get(i).incrementaElementoCoordenada(0, -10);
                        }
                        if (multiplos.get(i).getElementoCoordenada().getCoordY() < this.getElementoCoordenada().getCoordY())
                        {
                            multiplos.get(i).incrementaElementoCoordenada(0, 10);
                        }
                    }
                    else
                    {
                        if (multiplos.get(i).getElementoCoordenada().getCoordX() - this.getElementoCoordenada().getCoordX() <= -50)
                        {
                            multiplos.get(i).incrementaElementoCoordenada(20, 0);
                        }
                        if (multiplos.get(i).getElementoCoordenada().getCoordY() > this.getElementoCoordenada().getCoordY())
                        {
                            multiplos.get(i).incrementaElementoCoordenada(0, -10);
                        }
                        if (multiplos.get(i).getElementoCoordenada().getCoordY() < this.getElementoCoordenada().getCoordY())
                        {
                            multiplos.get(i).incrementaElementoCoordenada(0, 10);
                        }
                    }
                }
            }
            if (this.getElementoCoordenada().getCoordX() + this.getElementoTamanho().getCoordX() <= tela.getBounds().getWidth())
            {
                this.incrementaElementoCoordenada(20, 0);
            }
        }
        
        if(bufferTeclado[2] == 1)
        {
            for (int i = 0; i < this.multiplos.size(); i++)
            {
                if (multiplos.get(i).getElementoCoordenada().getCoordX() >= 20)
                {
                    if (i == 1)
                    {
                        if (multiplos.get(i).getElementoCoordenada().getCoordX() - this.getElementoCoordenada().getCoordX() >= 150)
                        {
                            multiplos.get(i).incrementaElementoCoordenada(-20, 0);
                        }
                        if (multiplos.get(i).getElementoCoordenada().getCoordY() > this.getElementoCoordenada().getCoordY())
                        {
                            multiplos.get(i).incrementaElementoCoordenada(0, -10);
                        }
                        if (multiplos.get(i).getElementoCoordenada().getCoordY() < this.getElementoCoordenada().getCoordY())
                        {
                            multiplos.get(i).incrementaElementoCoordenada(0, 10);
                        }
                    }
                    else
                    {
                        if (multiplos.get(i).getElementoCoordenada().getCoordX() - this.getElementoCoordenada().getCoordX() >= 120)
                        {
                            multiplos.get(i).incrementaElementoCoordenada(-20, 0);
                        }
                        if (multiplos.get(i).getElementoCoordenada().getCoordY() > this.getElementoCoordenada().getCoordY())
                        {
                            multiplos.get(i).incrementaElementoCoordenada(0, -10);
                        }
                        if (multiplos.get(i).getElementoCoordenada().getCoordY() < this.getElementoCoordenada().getCoordY())
                        {
                            multiplos.get(i).incrementaElementoCoordenada(0, 10);
                        }
                    }
                }
            }
            if (this.getElementoCoordenada().getCoordX() >= 20)
            {
                this.incrementaElementoCoordenada(-20, 0);
            }
        }
        if(bufferTeclado[1] == 1)
        {
            for (int i = 0; i < this.multiplos.size(); i++)
            {
                if (multiplos.get(i).getElementoCoordenada().getCoordY() + multiplos.get(i).getElementoTamanho().getCoordY() <= tela.getHeight() - 20)
                {
                    if (i==1)
                    {
                        if (this.getElementoCoordenada().getCoordY() - (multiplos.get(i).getElementoCoordenada().getCoordY() + multiplos.get(i).getElementoTamanho().getCoordY()) >= 50)
                        {
                            multiplos.get(i).incrementaElementoCoordenada(0, 20);
                        }
                    }
                    else
                    {
                        if (this.getElementoCoordenada().getCoordY() - (multiplos.get(i).getElementoCoordenada().getCoordY() + multiplos.get(i).getElementoTamanho().getCoordY()) >= 20)
                        {
                            multiplos.get(i).incrementaElementoCoordenada(0, 20);
                        }
                    }
                }
            }
            if (this.getElementoCoordenada().getCoordY() + this.getElementoTamanho().getCoordY() <= tela.getHeight() - 20)
            {
                this.incrementaElementoCoordenada(0, 20);
            }
        }
        if(bufferTeclado[4] == 1)
        {
            this.atira(tela,tirosAliados);
            this.setTiro1Ready(0);
            this.setTiro2Ready(0);
            for (int i = 0; i < this.multiplos.size(); i++)
            {
                multiplos.get(i).atira(tela, tirosAliados);
                multiplos.get(i).setTiro1Ready(0);
                multiplos.get(i).setTiro2Ready(0);
            }
        }
    }
}
